Jun 2008, rešeni rok iz predmeta "Baze podataka"


fajlovi prikačeni uz rok.

U arhivi se nalaze: XML schema (.xsd), XML dokument (.xml), XQuery upit ili XPath putanja (.xq), SQl dump baze (.sql), visio 2003 dijagram (.vsd) ukoliko postoje takvi fajlovi vezani za zadatke.

XML: za sve fajlove je provereno da li su dobro oformljeni, a ako postoji i xml fajl i schema, xml fajl je validiran u odnosu na odgovarajuću šemu. Za kreiranje fajlova, proveru forme, validaciju, XPath i XQuery izraze korišćen je XML editor EditX http://www.editix.com/

SQL: baza je napravljena u MySQL-u pa prema tome SQL kod može imati netipičnu sintaksu ili funkcije različite od onih u knjizi. Upiti su provereni, prema mom shvatanju zadataka, koji često nisu baš lako shvatljivi. Najlakše je preko MySQLyog-a uraditi "restore from SQL dump" da bi mogli da probate upite nad podacima. Alati: MySQL http://www.mysql.com, MySQOyog www.webyog.com


1. zadatak

relacija:

ProjektniTim (ŠifraProjekta, JMBG, NazivProjekta, ImePrezime, PeriodAngažovanja, ŠifraSektora, NazivSektora)

funkcionalne zavisnosti:

ŠifraProjekta, JMBG --> PeriodAngažovanja, ŠifraSektora, NazivSektora, NazivProjekta, ImePrezime
ŠifraProjekta --> NazivProjekta
JMBG --> ImePrezime, ŠifraSektora, NazivSektora
ŠifraSektora --> NazivSektora
NazivSektora --> ŠifraSektora

definicije:

fukcionalna zavisnost:

u relaciji R atribut R.B (R.A i R.B mogu biti složeni) funkcionalno zavisi od atributa R.A (R.A funkcionalno određuje R.B) ako za svaku vrednost R.A postoji jedna i samo jedna vrednost R.B

potpuna funkcionalna zavisnost:

atribut R.B potpuno funkcionalno zavisi od atributa R.A ako funkcionalno zavisi od atributa R.A ali ne i od nekog pravog podskupa atributa R.A

determinanta:

determinanta je bilo koji prost ili složen atribut od koga neki drugi atribut u relaciji potpuno funkcionalno zavisi.

Boyce-Codd ova normalna forma:

Relacija R je u Boyce-Codd ovoj normalnoj formi ako su sve determinante ujedno i kandidati za ključ relacije.

determinante:

ŠifraProjekta --> NazivProjekta(D)
ŠifraSektora --> NazivSektora(D)
NazivSektora --> ŠifraSektora(D)
JMBG --> ImePrezime, ŠifraSektora, NazivSektora(D)
JMBG, ŠifraProjekta --> PeriodAngažovanja(D)(KK)

očigledno je da relacija nije u BC normalnoj formi. Dekompozicijom pri kojoj se iz relacije izvlače projekcije sa onim determinantama koje nisu kandidati za ključ, relacija se svodi na BCNF.

Projekat(ŠifraProjekta, NazivProjekta) jeste BCNF
ProjektniTim2(ŠifraProjekta, JMBG, ImePrezime, PeriodAngažovanja, ŠifraSektora, NazivSektora) nije BCNF (4D, 1KK)

dalje se dekomponuje relacija ProjektniTim2

Radnik(JMBG, ImePrezime, ŠifraSektora, NazivSektora) nije BCNF (3D, 1KK)
ProjektniTim3(ŠifraProjekta, JMBG, PeriodAngažovanja) jeste BCNF

dalje se dekomponuje relacija Radnik

Radnik2(JMBG, ImePrezime, ŠifraSektora) jeste BCNF
Sektor(ŠifraSektora, NazivSektora) jeste BCNF

konačno:

Sektor(ŠifraSektora, NazivSektora)
Radnik(JMBG, ImePrezime, ŠifraSektora)
Projekat(ŠifraProjekta, NazivProjekta)
ProjektniTim(ŠifraProjekta, JMBG, PeriodAngažovanja)


2. zadatak

A (A1#, A2, B1#)

B (B1#, B2, A1#)

G (B1#, G1)

D (A1#,D1)

E (E1#, E2)

H (B1#, A1#, E1#, H1)

C (E1#, C1)

F (E1#, F1)

FF (E1#, E1#)


3. zadatak


4. zadatak

a)

interface Istrazivac {

	relationship Projekat ucestvuje inverse Projekat :: ima_istrazivace;

};

class Osoba (extent Osobe key ID){

	attrinute short ID;
	attribute string Naziv;

	relationship Projekat zahteva inverse Projekat :: iniciran_od_osobe;

};

class Projekat (extent Projekti key ID){

	attribute short ID;
	attribute string Naziv;

	relationship setima_istrazivace inverse Istrazivac :: ucestvuje;
	relationship Osoba iniciran_od_osobe inverse Osoba :: zahteva;

};

class Profesor extends Osoba : Istrazivac (extent Profesori) {

	relationship Projekat ucestvuje inverse Projjekat :: ima_istrazivace;

};

b)

select 
	x
from
	x in Projekti
where
	x.iniciran_od_osobe in x.ima_istrazivace

5. zadatak

Kod vremenskog obeležavanja transakcija, transakcije na početku izvršavanja dobiju redni broj, tako da se kasnije zna koja je transakcija starija. Konflikt nastaje kada transakcija hoće da čita neki slog koji je mladja transakcija vec ažurirala, ili hoće da ažurira slog koji je mladja transakcija vec ažurirala ili videla. Konflikti se razrešavaju ponovnim startovanjem starije transakcije.

postoje dva identifikatora koji se zadaju svakom objektu baze podataka:

RMAX - najveća identifikacija transakcije koja je pročitala objekat
UMAX - najveća identifikacija transakcije koja je ažurirala objekat

čitanje:

if(t>=UMAX){
	operacija se prihvata;
	RMAX = max(t, RMAX);
}else{
	konflikt;
	restart T;
}       	

ažuriranje:

if(t>=RMAX && t>=UMAX){
	operacija se prihvata;
	UMAX = t;
}else{
	konflikt;
	restart T;
}     	

6. zadatak

a)

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
	elementFormDefault="qualified"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="
		http://www.w3.org/2001/XMLSchema
		http://www.w3.org/2001/XMLSchema.xsd">
    
    <xsd:element name="Model">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Kompanija" maxOccurs="unbounded">
                    <xsd:complexType>
                        <xsd:attribute name="PIB" type="xsd:ID"/>
                        <xsd:attribute name="Naziv" type="xsd:string"/>
                    </xsd:complexType>
                </xsd:element>

	    <xsd:complexType name="Letilica">
       	 	<xsd:attribute name="LID" type="xsd:ID"/>
    	    </xsd:complexType>

                <xsd:element name="Avion" maxOccurs="unbounded">
                    <xsd:complexType>
                        <xsd:complexContent>
                            <xsd:extension base="Letilica">
                                <xsd:attribute name="BrojSedista" type="xsd:integer"/>
                                <xsd:attribute name="BrojMotora" type="xsd:string"/>
                                <xsd:attribute name="Proizvodjac" type="xsd:IDREF" use="required"/>
                                <xsd:attribute name="Vlasnik" type="xsd:IDREF" use="required"/>
                            </xsd:extension>
                        </xsd:complexContent>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

b)

<?xml version="1.0" encoding="utf-8"?>
<Model
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="file:///D:/My%20FON/IV%20godina/I%20semestar/Baze%20podataka/BProkovi2008/jun2008/podA.xsd">
    
    <Kompanija PIB="K1" Naziv="Prince Aviation"/>
    <Kompanija PIB="K2" Naziv="Airbus"/>
    
    <Avion LID="A1" BrojSedista="50" BrojMotora="M1111" Proizvodjac="K2" Vlasnik="K2"/>
    <Avion LID="A2" BrojSedista="50" BrojMotora="M1112" Proizvodjac="K2" Vlasnik="K1"/>
    
</Model>

c)

XPath

//Avion[@Proizvodjac=@Vlasnik]

XQuery

for 
	$x in doc("podB.xml")/Model/Avion
where 
	$x/@Proizvodjac = $x/@Vlasnik
return 
	$x

7. zadatak

a)

select
	SIFIST, IMEIST, DATRODJ, DATZAP, PLATA, SIFINST, SRUKOV
from
	ISTRAZIVAC join UCESCE using(SIFIST)
where
		extract(year from current_date)-extract(year from DATZAP) = 5
group by
	SIFIST, IMEIST, DATRODJ, DATZAP, PLATA, SIFINST, SRUKOV
having
	count(SIFIST) > 60

b)

select
	GRAD, 
	sum(case when (extract(year from current_date)-extract(year from DATRODJ)) < 22 then 1 else 0 end) as "mladji od 22 godine",
	sum(case when (extract(year from current_date)-extract(year from DATRODJ))>20 and (extract(year from current_date)-extract(year from DATRODJ))<45 then 1 else 0 end) as "izmedju 20 i 45 godina",
	sum(case when (extract(year from current_date)-extract(year from DATRODJ))>50 then 1 else 0 end) as "stariji od 50 godina"
from
	ISTRAZIVAC join INSTITUT using(SIFINST)
group by
	GRAD	

c)

/*nije uzeto u obzir ogranicenje tekuce godine jer je besmisleno*/
create view RUKOVODILAC (NazivInstituta, ImeIstrazivaca, SifraIstrazivaca, DatumZaposlenja) as
select
	NAZIV, IMEIST, SIFIST, DATZAP
from
	ISTRAZIVAC join UCESCE using(SIFIST) join INSTITUT using(SIFINST)
group by
	NAZIV, IMEIST, SIFIST, DATZAP
having 
	count(SIFIST) > 10
and
	SIFIST in 
		(select distinct
			SRUKOV
		from
			ISTRAZIVAC)

8. zadatak